"""从yield生成器 到 yield表达式"""

list1 = [11, 23, '2', True, 2.33, 87, '2.2']


# 函数生成器
def li_zhi():
    for i in list1:
        if type(i) == int:
            yield i


for j in li_zhi():
    print(j)
print('----------------')

# 生成器表达式, 格式跟列表推导式一样
so = (i for i in list1 if type(i) == int)
for c in so:
    print(c)
"""
    推导式合集：已经完成所有计算，得到结果
        变量 = [item for item in 可迭代对象 if 条件] 列表推导式
        变量 = {k,v for k,v in 可迭代对象 if 条件} 字典推导式
        变量 = {item for item in 可迭代对象 if 条件} 集合推导式
    最新 生成器表达式：没有计算，并未执行，
        变量 = (item for item in 可迭代对象 if 条件) 生成器表达式
        for j in li_zhi():      只有在for循环中才会去执行一次，典型的延迟语法，调用一次，计算一次
            print(j)
    
    PS：典型的重思想，弱语法，语法不重要，重要的是思想，用意不用力，达到思想为主导
"""
print("----------------------------")


# 练习，分别使用生成器函数、生成器表达式、列表推导式 完成


class LianXi:
    """分别使用生成器函数、生成器表达式、列表推导式"""

    def __init__(self, info):
        self.info = info

    def __iter__(self):
        """生成器函数"""
        for i in self.info:
            if type(i) == str or type(i) == float:
                yield i

    def expression(self):
        """生成器表达式"""
        return (i for i in self.info if type(i) == str or type(i) == float)

    def list_expression(self):
        """列表推导式"""
        return [i for i in self.info if type(i) == str or type(i) == float]


# 生成器函数
so = LianXi(list1)
for o in so:
    print(type(o), o)

print("---------------------------")
# 列表推导式
sp = so.list_expression()
print(sp)

print("-----------------------")
# 生成器表达式
sps = so.expression()
for i in sps:
    print(i)
